From 6ce830f58a290214b431378cb0cbe8c33624945a Mon Sep 17 00:00:00 2001 From: "mjw@wray-m-3.hpl.hp.com" Date: Fri, 2 Jul 2004 09:22:56 +0000 Subject: [PATCH] bitkeeper revision 1.1041.3.3 (40e52970DgkhtxD_Mq--sUEE6uPUZg) Change console cleanup for domains so that it gets called when the domain channel goes away. Stops console listeners hanging around. --- tools/python/xen/xend/server/blkif.py | 3 - tools/python/xen/xend/server/channel.py | 6 +- tools/python/xen/xend/server/console.py | 73 ++++++++++++++++------ tools/python/xen/xend/server/controller.py | 2 +- tools/python/xen/xend/server/netif.py | 5 +- 5 files changed, 62 insertions(+), 27 deletions(-) diff --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py index 7310494377..d265ae382e 100755 --- a/tools/python/xen/xend/server/blkif.py +++ b/tools/python/xen/xend/server/blkif.py @@ -210,9 +210,6 @@ class BlkifController(controller.Controller): self.evtchn['port2']]) return val - def lostChannel(self): - controller.Controller.lostChannel(self) - def getDevices(self): return self.devices.values() diff --git a/tools/python/xen/xend/server/channel.py b/tools/python/xen/xend/server/channel.py index 0c9d316dec..caaa66e28c 100755 --- a/tools/python/xen/xend/server/channel.py +++ b/tools/python/xen/xend/server/channel.py @@ -174,9 +174,9 @@ class VirqChannel(BaseChannel): """Close the channel. Calls lostChannel(self) on all its clients and channelClosed() on the factory. """ - for c in self.clients: + for c in self.clients[:]: c.lostChannel(self) - del self.clients + self.clients = [] BaseChannel.close(self) def registerClient(self, client): @@ -238,7 +238,7 @@ class Channel(BaseChannel): """ if self.closed: return self.closed = 1 - for d in self.devs: + for d in self.devs[:]: d.lostChannel() self.factory.channelClosed(self) self.devs = [] diff --git a/tools/python/xen/xend/server/console.py b/tools/python/xen/xend/server/console.py index 336ccacca0..77f6343c3d 100755 --- a/tools/python/xen/xend/server/console.py +++ b/tools/python/xen/xend/server/console.py @@ -93,10 +93,15 @@ class ConsoleController(controller.Controller): output and the connected TCP sockets to post console input. """ + STATUS_NEW = 'new' + STATUS_CLOSED = 'closed' + STATUS_CONNECTED = 'connected' + STATUS_LISTENING = 'listening' + def __init__(self, factory, dom, console_port): controller.Controller.__init__(self, factory, dom) self.majorTypes = [ CMSG_CONSOLE ] - self.status = "new" + self.status = self.STATUS_NEW self.addr = None self.conn = None self.rbuf = xu.buffer() @@ -123,28 +128,31 @@ class ConsoleController(controller.Controller): return not (self.closed() or self.rbuf.empty()) def closed(self): - return self.status == 'closed' + return self.status == self.STATUS_CLOSED def connected(self): - return self.status == 'connected' + return self.status == self.STATUS_CONNECTED def close(self): - try: - self.status = "closed" - if self.conn: - self.conn.loseConnection() - self.listener.stopListening() - self.deregisterChannel() - self.lostChannel() - except Exception, ex: - print 'ConsoleController>close>', ex - raise + """Close the console controller. + """ + self.lostChannel() + + def lostChannel(self): + """The channel to the domain has been lost. + Cleanup: disconnect TCP connections and listeners, notify the controller. + """ + self.status = self.STATUS_CLOSED + if self.conn: + self.conn.loseConnection() + self.listener.stopListening() + controller.Controller.lostChannel(self) def listen(self): """Listen for TCP connections to the console port.. """ if self.closed(): return - self.status = "listening" + self.status = self.STATUS_LISTENING if self.listener: #self.listener.startListening() pass @@ -153,15 +161,25 @@ class ConsoleController(controller.Controller): self.listener = reactor.listenTCP(self.console_port, f) def connect(self, addr, conn): + """Connect a TCP connection to the console. + Fails if closed or already connected. + + addr peer address + conn connection + + returns 0 if ok, negative otherwise + """ if self.closed(): return -1 if self.connected(): return -1 self.addr = addr self.conn = conn - self.status = "connected" + self.status = self.STATUS_CONNECTED self.handleOutput() return 0 def disconnect(self): + """Disconnect the TCP connection to the console. + """ if self.conn: self.conn.loseConnection() self.addr = None @@ -169,15 +187,29 @@ class ConsoleController(controller.Controller): self.listen() def requestReceived(self, msg, type, subtype): + """Receive console data from the console channel. + + msg console message + type major message type + subtype minor message typ + """ self.rbuf.write(msg.get_payload()) self.handleOutput() def responseReceived(self, msg, type, subtype): - # Just ignore responses. + """Handle a response to a request written to the console channel. + Just ignore it because the return values are not interesting. + + msg console message + type major message type + subtype minor message typ + """ pass def produceRequests(self): - # Send as much pending console data as there is room for. + """Write pending console data to the console channel. + Writes as much to the channel as it can. + """ work = 0 while not self.wbuf.empty() and self.channel.writeReady(): msg = xu.message(CMSG_CONSOLE, 0, 0) @@ -187,7 +219,12 @@ class ConsoleController(controller.Controller): def handleInput(self, conn, data): """Handle some external input aimed at the console. - Called from a TCP connection (conn). + Called from a TCP connection (conn). Ignores the input + if the calling connection (conn) is not the one connected + to the console (self.conn). + + conn connection + data input data """ if self.closed(): return -1 if conn != self.conn: return 0 diff --git a/tools/python/xen/xend/server/controller.py b/tools/python/xen/xend/server/controller.py index 299bd621f6..49d6e26ea8 100755 --- a/tools/python/xen/xend/server/controller.py +++ b/tools/python/xen/xend/server/controller.py @@ -205,12 +205,12 @@ class Controller(CtrlMsgRcvr): def close(self): """Close the controller. """ - self.deregisterChannel() self.lostChannel() def lostChannel(self): """The controller channel has been lost. """ + self.deregisterChannel() self.factory.instanceClosed(self) class Dev: diff --git a/tools/python/xen/xend/server/netif.py b/tools/python/xen/xend/server/netif.py index 5760552e8b..0096511b7c 100755 --- a/tools/python/xen/xend/server/netif.py +++ b/tools/python/xen/xend/server/netif.py @@ -198,8 +198,9 @@ class NetifController(controller.Controller): def randomMAC(self): """Generate a random MAC address. - The OUI (Organisation Unique Identifier) used is AA:00:00, which - is a currently unassigned one that used to belong to DEC. + Uses OUI (Organizationally Unique Identifier) AA:00:00, an + unassigned one that used to belong to DEC. The OUI list is + available at 'standards.ieee.org'. The remaining 3 fields are random, with the first bit of the first random field set 0. -- 2.30.2